// 空代理

// const target = {
//   id: 'target'
// }

// const handle = {}
// const proxy = new Proxy(target,handle)

// console.log(proxy.id)
// console.log(target.id)

// 定义捕获器
// const target1 = {
//   id: 'target'
// }
// const handle1 = {
//   get() {
//     return 'handler override'
//   }
// }

// const proxy1 = new Proxy(target1,handle1)
// // console.log(proxy1.id)
// // 注意只能在代理对象上面操作才会促发捕获器
// console.log(proxy1['property'])
// console.log(proxy1.property)
// console.log(Object.create(proxy1)['prototype'])


// 捕获器参数和反射API


// 捕获器会接受三个参数 第一个是目标对象，要查询的熟悉，和代理对象三个参数
// const target = {
//   id: 'target'
// }
// const handle = {
//   get(trapTarget,property,receiver) {
//     console.log(trapTarget === target)
//     console.log(property)
//     console.log(receiver === proxy)
//   }
// }
// const proxy = new Proxy(target,handle)
// 有了这些参数可以重建被捕获方法的原始行为
// proxy.id

// const target = {
//   id: 'target'
// }

// const handle = {
//   get() {
//     return Reflect.get(...arguments)
//   }
// }
// const handle = {
//   get() {
//     return Reflect.get(...arguments) +' '+ 'decoration'
//   }
// }
// const proxy = new Proxy(target,handle)
// console.log(proxy.id)
// 反射API
// Relect.get() 获取属性值
// Relect.set() 设置属性和属性值
// Relect.has() 相当于in操作符
// Relect.delectProperty()  可以替代delete操作符
// Relect.construct()  可以替代new 操作符
const target = {
  foo: 'bar'
}
console.log(Reflect.get(target,'foo'))

Reflect.set(target,'bar','result')
console.log(target)